package com.smartj.web.common.result;


import cn.hutool.json.JSONUtil;

/**
 * Result 工具类
 * 用于产生Result 对象
 *
 * @param <T>
 */
public class ResultUtil<T> {


    /**
     * 根据code和message 返回一个Result对象
     *
     * @param code    code
     * @param message message
     * @return Result 对象
     */
    public static Result result(String code, String message) {
        return new Result(code, message);
    }

    /**
     * 使用 MessageInfo 生成一个Result对象
     * MessageInfo 接口能提供 Result对象中所需要的code和message的值
     *
     * @param messageInfo MessageInfo 对象
     * @return Result 对象
     */
    public static Result result(MessageInfo messageInfo) {
        return new Result(messageInfo.getCode(), messageInfo.getMessage());
    }

    /**
     * 构造一个不带数据表示成功的Result对象
     *
     * @return Result
     */
    public static Result success() {
        return new Result(CommonMessage.SUCCESS.getCode(), CommonMessage.SUCCESS.getMessage());
    }

    /**
     * 构造一个带有数据表示成功的Result对象
     *
     * @param data 数据
     * @param <T>  类型
     * @return 成功返回结果
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(CommonMessage.SUCCESS.getCode(), CommonMessage.SUCCESS.getMessage(), data);
    }


    /**
     * 构造一个带有数据表示成功的Result对象的Json字符串
     *
     * @param data data
     * @return Result对象的Json字符串
     */
    public static String successStr(Object data) {
        return JSONUtil.toJsonStr(ResultUtil.success(data));
    }


    /**
     * 根据code和message 返回一个Result对象
     * 语义上表示返回失败的结果
     *
     * @param code    code
     * @param message message
     * @return Result 对象
     */
    public static Result<Void> error(String code, String message) {
        return new Result<>(code, message);
    }

    /**
     * 使用 异常构造一个Result结果
     * 如果异常是MessageInfo 类型的话，通过 {@link ResultUtil#result(MessageInfo)}接口返回
     * 否则，返回一个系统异常，系统异常定义参考{@link CommonMessage#SYS_ERR}
     *
     * @param e 异常
     * @return Result 对象
     */
    public static Result error(Exception e) {
        if (e instanceof MessageInfo) {
            MessageInfo messageInfo = (MessageInfo) e;
            return result(messageInfo);
        }
        return new Result<>(CommonMessage.SYS_ERR.getCode(), e.getMessage());
    }
}
